Repository navigation
Version Packages - #411
Merged
Merged
Version Packages#411
Conversation
github-actions
Bot
force-pushed
the
changeset-release/main
branch
9 times, most recently
from
August 8, 2026 14:02
62f8492 to
70836c2
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
August 8, 2026 16:00
70836c2 to
6234771
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
@svelte-vitals/core@0.39.0
Minor Changes
a3dffb3:
architecture/prop-countnow counts named props destructured alongside a rest element (let { a, b, ...rest } = $props()) instead of treating the whole destructure as uncountable and staying silent. The named count is a lower bound on the true prop count, and the rule only flags a component whose named-prop count exceeds itsmaxoption (default 6), so this can only surface findings on previously invisible components — never a false positive. A bare rest element with no named props (let { ...rest } = $props()) and a non-destructured$props()are still not counted.Re-measured the per-repo p90 median across the same 10-repo corpus from the 2026-07-25 threshold recalibration with the fix applied: 6.5 (was 6).
MAX_PROPSstays 6.8e8bd5c:
architecture/reserved-directory-names,architecture/directory-namingandarchitecture/unit-entry-filenow report
examinedcounts in the JSON report, the same mechanismarchitecture/reserved-name-placementalready used: per declaration, how many places it judged, keyed by the same bare glob string its own
diagnostic names. A run configuring all four rules previously got one
examinedentry and silence for theother three, even though all three already emit a project-scoped finding for a declaration that matched no
directory — the count fills in the missing number for a key that governed a hundred directories versus one.
No exported shape changes:
runRules,RuleContext.recordExaminedandJsonReport.examinedalready exist.This is JSON-only, matching the existing feature — no CLI or console output changes.
ac41349: Every rule's PASS results now carry the same
locationa penalized result on the same route/file would — visible to library consumers readingresultsand in therules.*.passedcounts, not only the two rule ids (seo/title-presenceand theheadTagRule-backed family) that already did this. (The JSON report'sroutes[].issues/siteIssuesarrays stay penalized-only, so this isn't visible there.) Fixesfiles:-scopedseverity: 'off'overrides silently failing to remove a passing seed (issue files:-scoped 'off' cannot remove passing seeds from seo/title-length, seo/description-length, performance/preconnect #382):overrideMatchesmatchesfiles:against a result'slocation, and a PASS with nolocationcould never match, so'off'removed a rule's penalized findings but left its passing seed counted.route:-scoped overrides were unaffected.architecture/unit-entry-file's per-declaration pass (deliberately route-less since fix(core): make a displayed score of 100 mean zero findings #337) is unchanged — it never had this bug (locationwithoutroutewas never reachable by aroute:glob to begin with, andfiles:already matched it vialocation).No rule's
id,severity, ordetectionchanges, andscore.tsnever readslocationdirectly. Scores can still move in any mode through the fix itself: afiles:-scoped'off'now removes the passing seeds it always claimed to (the issue's reproduction moves 98 → 96 once the seed is gone), where before it silently removed only the penalized findings. Benign display change: the console reporter's--verbosePassed listing printslocation ?? route, so a rule newly carryinglocationon PASS now lists the file path there instead of the route id. Seedocs/superpowers/specs/2026-08-08-pass-result-location-design.mdfor the full design record and blast-radius enumeration.65ce0c1: The HTML report and the dev dashboard now show each category's reach ("N of M keys affected") beside its score. The score floor design (2026-08-05) moved magnitude out of the score and into
categories[cat].affectedKeys/keys, so a reader could no longer tell one affected file from forty-one — both surfaces received the fields and rendered nothing. Per-route category rendering (routes[].categories) remains a deferred, separate question.acee3c6: Add
anyCaseUnitScopestoarchitecture/reserved-directory-names: a counterpart tounitScopesthatgoverns units whose name does not begin A–Z.
unitScopesidentifies a unit withisUnitDir, which requires the directory name to begin A–Z as wellas holding a same-stemmed child file — so a lowercase,
.ts- or.svelte.ts-entry unit's children (measuredat 129 of 299 units, 43%, on a real tree) were never governed by any declaration.
anyCaseUnitScopestakesthe same option shape against
isAnyCaseUnitDir, the same test without the letter requirement. Declaringthe identical glob in both maps is not a collision:
unitScopesgoverns at capitalised units,anyCaseUnitScopesgoverns alone at the lowercase onesunitScopesnever reaches.Default behavior is unchanged —
anyCaseUnitScopesdefaults to{}, so a project that does not declare itsees no new findings.
svelte-vitals@0.44.1
Patch Changes
a9fba45: Fix
--baselinesilently masking a genuine regression: for the SEO rules whose passing results already carry a filelocation(seo/title-presenceand the tenheadTagRule-backed ids —canonical-url,og-title,og-image,charset,viewport,twitter-card,description-presence,og-description,json-ld,og-url), a route that passed at the baseline ref and then regressed (e.g. a<title>deleted) produced identical comparison keys on both sides and was dropped as "not new" instead of being reported.findingKeycomparison is now penalized-findings-only on both the current and baseline sides (matching the patternsuppressions.tsalready uses), so a passing result can never key-collide with a penalized one.Behavior change as a result: passing results no longer appear in
--baselineoutput at all — previously, a route that was penalized at the baseline and now passes could still surface its passing result. Under--baseline --score, Health is now computed over the new penalized findings only — pass-seeded routes and categories no longer raise it — so a--baselinerun's Health/--min-healthcan report a lower (stricter) score than before. Seedocs/superpowers/specs/2026-08-08-pass-result-location-design.md("findingKey/filterToNewFindings" section) for the design record.ac41349: Fix
files:-scopedseverity: 'off'overrides silently failing to remove a passing seed (issue files:-scoped 'off' cannot remove passing seeds from seo/title-length, seo/description-length, performance/preconnect #382), now that@svelte-vitals/coregives every rule's PASS result the samelocationits penalized counterpart would (see the linked design doc). Without a matching CLI-side fix, that alone would have broken--diff/--staged:filterToChangedFilesused to keep a result whenever it had anylocationin the changed set, so once passing results uniformly carried one, an incidental pass on a changed file could survive scoping.filterToChangedFiles(and its one call site,applyScope) now takes the resolvedConfig(optional, defaulting likefilterToNewFindingsinbaseline.tsalready does) and keeps a result only when it's penalized, or isarchitecture/unit-entry-file's deliberately route-less pass seed (PR fix(core): make a displayed score of 100 mean zero findings #337) — every other route-carrying PASS is dropped even when itslocationis in the changed set.Behavior change as a result: for
seo/title-presenceand the tenheadTagRule-backed rule ids (canonical-url,og-title,og-image,charset,viewport,twitter-card,description-presence,og-description,json-ld,og-url) — which already carriedlocationon PASS before this change — a passing result on a changed file no longer survives--diff/--stagedfiltering. This was a live, undetected leak: a single incidental passing check on a changed file could promote its whole category from absent to a fabricated 100, pulling--diffHealth upward. Measured on the reference shape (one criticalcorrectnessfinding plus one such SEO PASS, both on changed files, default config): Health moves from 89 to 79 — 79 is correct; 89 was the bug. A--min-healthgate can now fail a run that previously passed only because of this leak. The three rules named in the design doc (seo/title-length,seo/description-length,performance/preconnect) newly gainlocationin this release too, but their PASS results are penalized-gated the same way, so they contribute no net--diffHealth movement of their own — theirlocationaddition only matters for thefiles:-override fix above.architecture/unit-entry-file's route-less pass seed is exempt from the drop above (PR fix(core): make a displayed score of 100 mean zero findings #337) — this preserves pre-existing behavior, not a new exception:main'sfilterToChangedFilesalready kept this pass unconditionally (noisPenalizedgate at all), so a changed conforming unit already promotedarchitectureto a fabricated 100 in--diffHealth before this release, and still does after — the tradeoff (that pass staying visible under--diff, at that cost) is fix(core): make a displayed score of 100 mean zero findings #337's, kept as-is, not something this PR introduces or removes.See
docs/superpowers/specs/2026-08-08-pass-result-location-design.mdfor the full design record. Thesvelte-vitals-actionrepo bundlesapplyScope, so its--diffHealth inherits this change on its next dependency bump — its own release notes should carry the same warning.bd946e2: Let
--out-file -(space-separated) and--out-file=-stream to stdout again, matching the documented contract (--help, the reporters guide, andsvelte-vitals docs show output). The flag-shaped/empty-value guard added in the previous release rejected the literal-along with every other dash-prefixed value;-is now the one allowed exception, exempted only for--out-file. Regular file paths (e.g.--out-file report.html) were never affected and remain valid; dash-prefixed values for every other flag — and any dash-prefixed--out-filevalue other than exactly-— still exit 2 as before.7c5a11b: Exit 2 when
--rulesand--categoryare both passed and--categoryexcludes every rule named in--rules. PreviouslyanalyzeProject's category filter ran after rule selection, so a--rulesid whose category wasn't in--categorywas dropped silently — the run exited 0 with zero rules examined and nothing on stderr (issue cli: --rules with a --category that excludes every named rule runs nothing at exit 0 #384). The check mirrors the existing unknown-rule-id error: fatal, naming the excluded rule id(s) and the--categorylist.--ignoreis unaffected — ignoring a rule that--categoryalready excludes is harmless, not a conflict.f0798b0: Update the registry-visible package descriptions and keywords, which still described svelte-vitals as an SEO-only checker.
svelte-vitals's description now matches its own--helptext — a deterministic SvelteKit code-health scanner across SEO, performance, correctness, security, and architecture — and addsperformance,security,code-quality,static-analysiskeywords.@svelte-vitals/vite's description now also mentions the live dev dashboard alongside the build-time prerendered-HTML analysis. No behavior change.ab41e48: Scoped runs (
--diff/--staged/--baseline) no longer reportsvelte-vitals-suppressions.jsonentries as stale just because the scope excluded their findings — staleness is now judged against the project-wide result set, so the documented CI recipe (--diff origin/main --baseline origin/main) no longer prints a misleading "N stale entries — re-run --update-suppressions to prune" on every run.--routeruns, where even the project-wide set is collected route-narrowed, omit the stale count entirely rather than report an unreliable one.--update-suppressionscombined with--routenow refuses (exit 2) instead of silently pruning suppression entries outside that route.28d22ae: Naming a rule in
--rulesthat a configoverridesentry scopes'off'(directly by rule id, or via its category key) now prints a startup warning naming the rule and the overrides entry'sfiles/routescope, instead of silently reporting a compliant tree. The semantics — whether--rulesshould force-enable through a scoped'off'— are deliberately unchanged; only the silence is fixed (cli: a rule named in --rules that config.overrides scopes off reports nothing, silently #385).Updated dependencies [a3dffb3]
Updated dependencies [8e8bd5c]
Updated dependencies [ac41349]
Updated dependencies [65ce0c1]
Updated dependencies [acee3c6]
@svelte-vitals/vite@0.29.1
Patch Changes
svelte-vitals's description now matches its own--helptext — a deterministic SvelteKit code-health scanner across SEO, performance, correctness, security, and architecture — and addsperformance,security,code-quality,static-analysiskeywords.@svelte-vitals/vite's description now also mentions the live dev dashboard alongside the build-time prerendered-HTML analysis. No behavior change.